﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Globalization;

namespace RiskMan.DataClass.Models.Plaza_II.FortsPosRepl
{
    /// <summary>
    /// Таблица 23. Поля таблицы position -  Позиции клиентов
    /// </summary>
    public class Position : INotifyPropertyChanged
    {
        #region private

        private long _replId;
        private long _replRev;
        private long _replAct;
        private int _isinId;
        private string _clientCode;
        private int _openQty;
        private int _buysQty;
        private int _sellsQty;
        private int _pos;
        private Decimal _netVolumeRur;
        private long _lastDealId;
        private Decimal _waprice;

        #endregion

        #region public

        /// <summary>
        /// Служебное поле подсистемы репликации
        /// </summary>
        public long ReplId
        {
            get { return _replId; }
            set
            {
                if (_replId != value)
                {
                    _replId = value;
                    RaisePropertyChanged("ReplId");
                }
            }
        }

        /// <summary>
        /// Служебное поле подсистемы репликации
        /// </summary>
        public long ReplRev
        {
            get { return _replRev; }
            set
            {
                if (_replRev != value)
                {
                    _replRev = value;
                    RaisePropertyChanged("ReplRev");
                }
            }
        }

        /// <summary>
        /// Служебное поле подсистемы репликации
        /// </summary>
        public long ReplAct
        {
            get { return _replAct; }
            set
            {
                if (_replAct != value)
                {
                    _replAct = value;
                    RaisePropertyChanged("ReplAct");
                }
            }
        }

        /// <summary>
        /// Уникальный числовой идентификатор инструмента
        /// </summary>
        public int IsinId
        {
            get { return _isinId; }
            set
            {
                if (_isinId != value)
                {
                    _isinId = value;
                    RaisePropertyChanged("IsinId");
                }
            }
        }

        /// <summary>
        /// Код клиента
        /// </summary>
        public string ClientCode
        {
            get { return _clientCode; }
            set
            {
                if (_clientCode != value)
                {
                    _clientCode = value;
                    RaisePropertyChanged("ClientCode");
                }
            }
        }

        /// <summary>
        /// Количество позиций на начало сессии
        /// </summary>
        public int OpenQty
        {
            get { return _openQty; }
            set
            {
                if (_openQty != value)
                {
                    _openQty = value;
                    RaisePropertyChanged("OpenQty");
                }
            }
        }

        /// <summary>
        /// Количество купленных контрактов в ходе сессии
        /// </summary>
        public int BuysQty
        {
            get { return _buysQty; }
            set
            {
                if (_buysQty != value)
                {
                    _buysQty = value;
                    RaisePropertyChanged("BuysQty");
                }
            }
        }

        /// <summary>
        /// Количество проданных контрактов в ходе сессии
        /// </summary>
        public int SellsQty
        {
            get { return _sellsQty; }
            set
            {
                if (_sellsQty != value)
                {
                    _sellsQty = value;
                    RaisePropertyChanged("SellsQty");
                }
            }
        }

        /// <summary>
        /// Текущая позиция
        /// </summary>
        public int Pos
        {
            get { return _pos; }
            set
            {
                if (_pos != value)
                {
                    _pos = value;
                    RaisePropertyChanged("Pos");
                }
            }
        }

        /// <summary>
        /// Нетто-сумма денег, в рублях, на которую были совершены
        /// сделки. Положительное число - деньги приходят,
        /// отрицательное - деньги выплачиваются
        /// </summary>
        public Decimal NetVolumeRur
        {
            get { return _netVolumeRur; }
            set
            {
                if (_netVolumeRur != value)
                {
                    _netVolumeRur = value;
                    RaisePropertyChanged("NetVolumeRur");
                }
            }
        }

        /// <summary>
        /// Номер последней сделки
        /// </summary>
        public long LastDealId
        {
            get { return _lastDealId; }
            set
            {
                if (_lastDealId != value)
                {
                    _lastDealId = value;
                    RaisePropertyChanged("LastDealId");
                }
            }
        }

        /// <summary>
        /// Средневзвешенная цена
        /// </summary>
        public Decimal Waprice
        {
            get { return _waprice; }
            set
            {
                if (_waprice != value)
                {
                    _waprice = value;
                    RaisePropertyChanged("Waprice");
                }
            }
        }

        #endregion


        #region event PropertyChangedEventHandler

        public event PropertyChangedEventHandler PropertyChanged;

        protected void RaisePropertyChanged(string propertyName)
        {
            var handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(propertyName));
            }
        }

        #endregion

        #region Processing
        public static Position ParsePosition(Dictionary<String, String> relation)
        {
            Position tmp = new Position();
            tmp.Parse(relation);
            return tmp;
        }

        public void Parse(Dictionary<String, String> relation)
        {
            foreach (String field in relation.Keys)
            {
                String value = relation[field];

                switch (field)
                {
                    case "replID": long.TryParse(value, out _replId); break;
                    case "replRev": long.TryParse(value, out _replRev); break;
                    case "replAct": long.TryParse(value, out _replAct); break;
                    case "isin_id": int.TryParse(value, out _isinId); break;
                    case "client_code": _clientCode = value; break;
                    case "open_qty": int.TryParse(value, out _openQty); break;
                    case "buys_qty": int.TryParse(value, out _buysQty); break;
                    case "sells_qty": int.TryParse(value, out _sellsQty); break;
                    case "pos": int.TryParse(value, out _pos); break;
                    case "net_volume_rur": Decimal.TryParse(value, NumberStyles.Number, CultureInfo.GetCultureInfo("en-US"), out _netVolumeRur); break;
                    case "last_deal_id": long.TryParse(value, out _lastDealId); break;
                    case "waprice": Decimal.TryParse(value, NumberStyles.Number, CultureInfo.GetCultureInfo("en-US"), out _waprice); break; 

                };
            }
        }

        public static void AddValueToObsColPosition(Position inst)
        {
            MainWindow.StaticLevel._dataProvider.PositionList.Add(inst);
        }
        #endregion
    }
}
